package com.tro.common.util.string;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class AESTool {
	/* 
     * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式，key需要为16位。 
     */  
    private String sKey = "abcdef0123456789";
    private String ivParameter = "0123456789abcdef";  
    private static AESTool instance = null;  
    private String sign="CE9B16C2E74B5CE210E3F334E035B98A";//签名 leeko
  
    public AESTool() {  
  
    }  
  
    public static AESTool getInstance() {  
        if (instance == null)  
            instance = new AESTool();  
        return instance;  
    }  
  
    // 加密  
    public String encrypt(String sSrc){  
        String result = "";  
        sSrc=sSrc+sign;
        try {  
            Cipher cipher;  
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  
            byte[] raw = sKey.getBytes();  
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度  
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);  
            byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));  
            result = new BASE64Encoder().encode(encrypted);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }   
        // 此处使用BASE64做转码。  
        return result;  
                  
    }  
  
    // 解密  
    public String decrypt(String sSrc){  
        try {  
            byte[] raw = sKey.getBytes("ASCII");  
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());  
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);  
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密  
            byte[] original = cipher.doFinal(encrypted1);  
            String originalString = new String(original, "utf-8");  
            originalString=originalString.substring(0,originalString.length()-32);
            return originalString;  
        } catch (Exception ex) {  
            ex.printStackTrace();  
            return null;  
        }  
    }  
    
    public void desc(String cSrc,String key){
    	//String cSrc = "test/test?id=123";  
        System.out.println(cSrc + "  长度为" + cSrc.length());  
        // 加密  
        long lStart = System.currentTimeMillis();  
        String enString = AESTool.getInstance().encrypt(cSrc);  
        System.out.println("加密后的字串是：" + enString + "    长度为" + enString.length());  
          
        long lUseTime = System.currentTimeMillis() - lStart;  
        System.out.println("加密耗时：" + lUseTime + "毫秒");  
        // 解密  
        lStart = System.currentTimeMillis();  
        String DeString = AESTool.getInstance().decrypt(enString);  
        System.out.println("解密后的字串是：" + DeString);  
        lUseTime = System.currentTimeMillis() - lStart;  
        System.out.println("解密耗时：" + lUseTime + "毫秒");  
    	
    }
    private static double EARTH_RADIUS = 6378.137;

	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}

    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
		
		double radLat1 = rad(lat1);
		double radLat2 = rad(lat2);
		double a = radLat1 - radLat2;
		double b = rad(lng1) - rad(lng2);
		double s = 2 * Math.asin(Math.sqrt(
				Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000d) / 10000d;
		s = s * 1000;
		
		return s;
	}
	
	
public static void main(String[] args){  
	
	AESTool.getInstance().desc("/test/test/test/test/tset/tses?id=123","");
	AESTool.getInstance().desc("/test/test/set/tses?id=123","");
	String str= AESTool.getInstance().decrypt("Maxct7dTv0ckdbwOEOIg/+C2dGG8o6D8MFdX2kfHci9wD4Q7njHiT9uq34DB6h4IKvNFqqHq+bcUFO6DO9BXrQ== ");
	//String str=AESTool.getInstance().decrypt("Maxct7dTv0ckdbwOEOIg/+C2dGG8o6D8MFdX2kfHci9wD4Q7njHiT9uq34DB6h4IKvNFqqHq+bcU");
	System.out.println(str);
    }  
}
